home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Programming / OUI / envman.lha / EnvManager / envman.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-10  |  6.2 KB  |  237 lines

  1. // $Id$
  2. #include <exec/types.h>
  3. #include <dos/dos.h>
  4. #include <dos/dosextens.h>
  5. #include <dos/exall.h>
  6. #include <dos/var.h>
  7. #include <graphics/gfxbase.h>
  8. #include <diskfont/diskfont.h>
  9. #include <string.h>
  10. #include <stdio.h>
  11.  
  12. #include <proto/exec.h>
  13. #include <proto/graphics.h>
  14. #include <proto/dos.h>
  15. #include <proto/amigaguide.h>
  16. #include <mydebug.h>
  17. #include <compiler.h>
  18.  
  19. #define NO_CLASS_WINDOW_INLINES
  20. #include <screen.h>
  21. #include <locale.h>
  22.  
  23. #include "envdef.h"
  24. #include "enventry.h"
  25. #include "envwin.h"
  26. #include "envman_rev.h"
  27.  
  28. nlist *envlist ;
  29. nlist *envarclist ;
  30. nlist *envloclist ;
  31.  
  32. LONG envsize = 0 ;
  33. LONG envlocsize = 0 ;
  34. Library *ConsoleDevice ;
  35. Process *proc ;
  36. screen *ns ;
  37. char NormalName[MAXFONTNAME] = "Times.font" ;
  38. char TinyName[MAXFONTNAME] = "Helvetica.font" ;
  39. TTextAttr Normal ;
  40. TTextAttr Tiny ;
  41. char *version = VSTRING ;
  42.  
  43. catalog *ecat ;
  44.  
  45.  
  46. envwindow *ew ;
  47.  
  48. ULONG               asig ;
  49. AMIGAGUIDECONTEXT   HelpHandle ;
  50. NewAmigaGuide       nag = {NULL};
  51. char                basename[80] ;
  52. AmigaGuideMsg       *amsg;
  53. BOOL                amgok=FALSE;
  54.  
  55.  
  56. Library __near *LocaleBase ;
  57. Library *AmigaGuideBase ;
  58.  
  59. void _STI_200_initlibs()
  60. {
  61.     LocaleBase = OpenLibrary((UBYTE *)"locale.library", 0) ;
  62.     AmigaGuideBase = OpenLibrary((UBYTE *)"amigaguide.library", 39) ;
  63. }
  64.  
  65. void _STD_200_closelibs()
  66. {
  67.     if (LocaleBase) CloseLibrary(LocaleBase) ;
  68.     if (AmigaGuideBase) CloseLibrary(AmigaGuideBase) ;
  69. }
  70.  
  71.  
  72. extern "C" {
  73. void _STI_4500_initcat()
  74. {
  75.         ecat = new catalog("envman.catalog", "english", NULL) ;
  76. }
  77.  
  78.  
  79. void _STD_4500_closecat()
  80. {
  81.     delete ecat ;
  82. }
  83. }
  84.  
  85.  
  86. void initlist(STRPTR name, UWORD flags, nlist *l, char type, char *prevpath)
  87. {
  88. ExAllData       *EAData ;
  89. ExAllData       *ead ;
  90. ExAllControl    *eac ;
  91. BOOL            more ;
  92. char            locname[MAXSIZE] ;
  93. char            fname[MAXSIZE] ;
  94. char            *contents ;
  95. char            path[MAXSIZE] ;
  96. BPTR            clef ;
  97. BPTR            file ;
  98.  
  99.     strcpy(path, name) ;
  100.     if (prevpath) {
  101.         AddPart(path, prevpath, MAXSIZE-1) ;
  102.     }
  103.     clef = Lock(path, ACCESS_READ);
  104.  
  105.     EAData = new ExAllData[MAXENTRIES] ;
  106.  
  107.     eac = (ExAllControl *)AllocDosObject(DOS_EXALLCONTROL,NULL);
  108.     eac->eac_Entries = MAXENTRIES ;
  109.     eac->eac_MatchString = NULL ;
  110.     eac->eac_MatchFunc = NULL ;
  111.     eac->eac_LastKey = 0;
  112.     do {
  113.         more = (BOOL)ExAll(clef, EAData, sizeof(ExAllData)*MAXENTRIES, ED_SIZE, eac);
  114.         if ((!more) && (IoErr() != ERROR_NO_MORE_ENTRIES)) {
  115.             // ExAll failed abnormally
  116.             break;
  117.         }
  118.         if (eac->eac_Entries == 0) {
  119.             // ExAll failed normally with no entries
  120.             continue;                   // ("more" is *usually* zero)
  121.         }
  122.         ead = EAData;
  123.         do {
  124.             if (prevpath) {
  125.                 strcpy(locname, prevpath) ;
  126.                 AddPart(locname, (STRPTR)ead->ed_Name, MAXSIZE-1) ;
  127.             }
  128.             else  {
  129.                 strncpy(locname, (char *)ead->ed_Name, MAXSIZE-1) ;
  130.                 locname[MAXSIZE-1] = '\0' ;
  131.             }
  132.             if (ead->ed_Type>0) {
  133.                 initlist(name, flags, l, type, locname) ;
  134.             }
  135.             else {
  136.                 contents = new char[ead->ed_Size+1] ;
  137.                 strcpy(fname, name) ;
  138.                 AddPart(fname, locname, MAXSIZE-1) ;
  139.                 if (file = Open(fname, MODE_OLDFILE)) {
  140.                     Read(file, contents, ead->ed_Size) ;
  141.                     Close(file) ;
  142.                     if (!(flags & GVF_SAVE_VAR))
  143.                         envsize += ead->ed_Size ;
  144.                     l->enqueue(new enventry(locname, contents, ead->ed_Size, type)) ;
  145.                 }
  146.                 delete contents ;
  147.             }
  148.             ead = ead->ed_Next;
  149.         } while (ead);
  150.  
  151.     } while (more);
  152.  
  153.     FreeDosObject(DOS_EXALLCONTROL,eac);
  154.     delete EAData ;
  155.     UnLock(clef);
  156. }
  157.  
  158. void initloclist(Process *p)
  159. {
  160. LocalVar    *lv ;
  161. char        locname[MAXSIZE] ;
  162.  
  163.     lv = (LocalVar *)p->pr_LocalVars.mlh_Head ;
  164.     while (lv->lv_Node.ln_Succ) {
  165.         strcpy(locname, lv->lv_Node.ln_Name) ;
  166.         envloclist->enqueue(new enventry(locname, (char *)lv->lv_Value,
  167.             lv->lv_Len, (lv->lv_Node.ln_Type & LV_ALIAS)?ALIAS_TYPE:LOCAL_TYPE)) ;
  168.         envlocsize += sizeof(LocalVar) + lv->lv_Len ;
  169.  
  170.         lv = (LocalVar *)lv->lv_Node.ln_Succ ;
  171.     }
  172. }
  173.  
  174.  
  175. void main(void)
  176. {
  177.     ns = new screen(NULL, "Workbench") ;
  178.     if (ns && ns->status) {
  179.         proc = (Process *)FindTask(NULL) ;
  180.  
  181.         envlist = new nlist ;
  182.         initlist("ENV:", GVF_GLOBAL_ONLY|GVF_BINARY_VAR|GVF_DONT_NULL_TERM, envlist, GLOBAL_TYPE, NULL) ;
  183.         envarclist = new nlist ;
  184.         initlist("ENVARC:", GVF_GLOBAL_ONLY|GVF_SAVE_VAR|GVF_BINARY_VAR|GVF_DONT_NULL_TERM, envarclist, ARCHIVED_TYPE, NULL) ;
  185.  
  186.         envloclist = new nlist ;
  187.         initloclist(proc) ;
  188.  
  189.         strcpy((char *)NormalName, (char *)ns->scr->Font->ta_Name) ;
  190.         Normal.tta_Name = NormalName ;
  191.         Normal.tta_YSize = ns->scr->Font->ta_YSize ;
  192.         Normal.tta_Style = ns->scr->Font->ta_Style ;
  193.         Normal.tta_Flags = ns->scr->Font->ta_Flags ;
  194.  
  195.         strcpy((char *)TinyName, (char *)GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name) ;
  196.         Tiny.tta_Name = TinyName ;
  197.         Tiny.tta_YSize = GfxBase->DefaultFont->tf_YSize ;
  198.         Tiny.tta_Style = GfxBase->DefaultFont->tf_Style ;
  199.         Tiny.tta_Flags = GfxBase->DefaultFont->tf_Flags ;
  200.  
  201.         if (AmigaGuideBase) {
  202.             sprintf(basename, "Envman.guide") ;
  203.             nag.nag_Name = basename ;
  204.             nag.nag_Node = "MAIN" ;
  205.             nag.nag_Line = 0;
  206.             nag.nag_PubScreen = NULL ;
  207.             CacheClearU() ;
  208.             if (HelpHandle = OpenAmigaGuideAsync(&nag, NULL)) {
  209.                 asig = AmigaGuideSignal(HelpHandle) ;
  210.             }
  211.         }
  212.  
  213.         if (ew = new envwindow(10, 10, 500, 120)) {
  214.             ew->open(ns) ;
  215.             if (ew->initok) {
  216.                 ew->eventloop() ;
  217.                 ew->close() ;
  218.             }
  219.             delete ew ;
  220.         }
  221.         if (AmigaGuideBase && HelpHandle) {
  222.             CloseAmigaGuide(HelpHandle) ;
  223.         }
  224.         delete envlist ;
  225.         delete envarclist ;
  226.         delete envloclist ;
  227.  
  228.     }
  229.     delete ns ;
  230.  
  231. }
  232.  
  233. #if defined( __GNUG__ )
  234. ADD2INIT(_STI_4500_initcat, -40);
  235. ADD2EXIT(_STD_4500_closecat,-40);
  236. #endif
  237.